home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-10-22 | 4.9 KB | 166 lines | [TEXT/KAHL] |
- // Copyright: © 1992 by Apple Computer, Inc., all rights reserved.
-
- #include "mtb.h"
-
- /* for the following constants, please consult the Macintosh
- Audio Compression and Expansion Toolkit, specifically pages
- 38 and 39 */
- #define kMACEBeginningNumberOfBytes 6
- #define kMACE31MonoPacketSize 2
- #define kMACE31StereoPacketSize 4
- #define kMACE61MonoPacketSize 1
- #define kMACE61StereoPacketSize 2
-
- void CreateSoundDescription (Handle sndHandle,
- SoundDescriptionHandle sndDesc,
- long *sndDataOffset,
- long *numSamples,
- long *sndDataSize )
- {
- long sndHdrOffset = 0;
- long sampleDataOffset;
- SoundHeaderPtr sndHdrPtr = nil;
- long numFrames;
- long samplesPerFrame;
- long bytesPerFrame;
- SignedByte sndHState;
- SoundDescriptionPtr sndDescPtr;
-
- *sndDataOffset = 0;
- *numSamples = 0;
- *sndDataSize = 0;
-
- SetHandleSize( (Handle)sndDesc, sizeof(SoundDescription) );
- CheckError(MemError(),"\pSetHandleSize");
-
- sndHdrOffset = GetSndHdrOffset (sndHandle);
- if (sndHdrOffset == 0) CheckError(-1, "\pGetSndHdrOffset ");
-
- // we can use pointers since we don't move memory
- sndHdrPtr = (SoundHeaderPtr) (*sndHandle + sndHdrOffset);
- sndDescPtr = *sndDesc;
-
- sndDescPtr->descSize = sizeof (SoundDescription);
- // total size of sound description structure
- sndDescPtr->resvd1 = 0;
- sndDescPtr->resvd2 = 0;
- sndDescPtr->dataRefIndex = 1;
- sndDescPtr->compressionID = 0;
- sndDescPtr->packetSize = 0;
- sndDescPtr->version = 0;
- sndDescPtr->revlevel = 0;
- sndDescPtr->vendor = 0;
-
- switch (sndHdrPtr->encode) {
- case stdSH:
- sndDescPtr->dataFormat = 'raw ';
- // uncompressed offset-binary data
- sndDescPtr->numChannels = 1;
- // number of channels of sound
- sndDescPtr->sampleSize = 8;
- // number of bits per sample
- sndDescPtr->sampleRate = sndHdrPtr->sampleRate;
- // sample rate
- *numSamples = sndHdrPtr->length;
- *sndDataSize = *numSamples;
- bytesPerFrame = 1;
- samplesPerFrame = 1;
- sampleDataOffset = (Ptr)&sndHdrPtr->sampleArea
- - (Ptr)sndHdrPtr;
- break;
-
- case extSH:
- {
- ExtSoundHeaderPtr extSndHdrP;
-
- extSndHdrP = (ExtSoundHeaderPtr)sndHdrPtr;
-
- sndDescPtr->dataFormat = 'raw ';
- // uncompressed offset-binary data
- sndDescPtr->numChannels = extSndHdrP->numChannels;
- // number of channels of sound
- sndDescPtr->sampleSize = extSndHdrP->sampleSize;
- // number of bits per sample
- sndDescPtr->sampleRate = extSndHdrP->sampleRate;
- // sample rate
- numFrames = extSndHdrP->numFrames;
- *numSamples = numFrames;
- bytesPerFrame = extSndHdrP->numChannels *
- ( extSndHdrP->sampleSize / 8);
- samplesPerFrame = 1;
- *sndDataSize = numFrames * bytesPerFrame;
- sampleDataOffset = (Ptr)(&extSndHdrP->sampleArea)
- - (Ptr)extSndHdrP;
- }
- break;
-
- case cmpSH:
- {
- CmpSoundHeaderPtr cmpSndHdrP;
-
- cmpSndHdrP = (CmpSoundHeaderPtr)sndHdrPtr;
- sndDescPtr->numChannels = cmpSndHdrP->numChannels;
- // number of channels of sound
- sndDescPtr->sampleSize = cmpSndHdrP->sampleSize;
- // number of bits per sample before compression
- sndDescPtr->sampleRate = cmpSndHdrP->sampleRate;
- // sample rate
- numFrames = cmpSndHdrP->numFrames;
- sampleDataOffset =(Ptr)(&cmpSndHdrP->sampleArea)
- - (Ptr)cmpSndHdrP;
- switch (cmpSndHdrP->compressionID) {
- case threeToOne:
- sndDescPtr->dataFormat = 'MAC3';
- // compressed 3:1 data
- samplesPerFrame = kMACEBeginningNumberOfBytes;
- *numSamples = numFrames * samplesPerFrame;
- switch (cmpSndHdrP->numChannels) {
- case 1:
- bytesPerFrame = cmpSndHdrP->numChannels
- * kMACE31MonoPacketSize;
- break;
- case 2:
- bytesPerFrame = cmpSndHdrP->numChannels
- * kMACE31StereoPacketSize;
- break;
- default:
- CheckError(-1, "\pCorrupt sound data" );
- break;
- }
- *sndDataSize = numFrames * bytesPerFrame;
- break;
- case sixToOne:
- sndDescPtr->dataFormat = 'MAC6';
- // compressed 6:1 data
- samplesPerFrame = kMACEBeginningNumberOfBytes;
- *numSamples = numFrames * samplesPerFrame;
- switch (cmpSndHdrP->numChannels) {
- case 1:
- bytesPerFrame = cmpSndHdrP->numChannels
- * kMACE61MonoPacketSize;
- break;
- case 2:
- bytesPerFrame = cmpSndHdrP->numChannels
- * kMACE61StereoPacketSize;
- break;
- default:
- CheckError(-1, "\pCorrupt sound data" );
- break;
- }
- *sndDataSize = (*numSamples) * bytesPerFrame;
- break;
- default:
- CheckError(-1, "\pCorrupt sound data" );
- break;
- }
- } // switch cmpSndHdrP->compressionID:*/
- break; // of cmpSH:
-
- default:
- CheckError(-1, "\pCorrupt sound data" );
- break;
-
- } // switch sndHdrPtr->encode*/
- *sndDataOffset = sndHdrOffset + sampleDataOffset;
- }
-